package xin.marcher.module.attribute.service.impl;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import xin.marcher.module.attribute.domain.dto.*;
import xin.marcher.module.attribute.domain.request.*;
import xin.marcher.module.attribute.repository.AttributeRepository;
import xin.marcher.module.attribute.service.AttributeService;
import xin.marcher.module.common.core.PageResult;
import xin.marcher.module.common.exception.BaseBizException;
import xin.marcher.module.common.exception.CommonErrorCodeEnum;
import xin.marcher.module.common.utils.ParamCheckUtil;

import javax.annotation.Resource;
import java.util.List;

/**
 * 属性管理相关操作API
 */
@Service
public class AttributeServiceImpl implements AttributeService {

    @Resource
    private AttributeRepository attributeRepository;

    /**
     * 添加属性
     */
    @Override
    public AttributeInfoResultDTO saveAttributeInfo(AttributeInfoRequest request) {
        // 入参检查
        checkAttributeInfoRequest(request);

        // 保存属性
        Long attributeId = attributeRepository.saveAttributeInfo(request);

        return new AttributeInfoResultDTO(attributeId, true);
    }

    private void checkAttributeInfoRequest(AttributeInfoRequest request) {
        ParamCheckUtil.checkObjectNonNull(request);
        if (request.getCategoryId() == null || request.getAttributeInputType() == null) {
            throw new BaseBizException(CommonErrorCodeEnum.SERVER_ILLEGAL_ARGUMENT_ERROR);
        }
        if (StringUtils.isAnyBlank(request.getAttributeName())) {
            throw new BaseBizException(CommonErrorCodeEnum.SERVER_ILLEGAL_ARGUMENT_ERROR);
        }
    }

    /**
     * 批量给属性添加可选的属性值
     */
    @Override
    public AttributeValueResultDTO saveAttributeValues(List<AttributeValueRequest> list) {
        attributeRepository.saveAttributeValues(list);
        return new AttributeValueResultDTO(true);
    }

    /**
     * 添加属性组接口
     */
    @Override
    public AttributeGroupResultDTO saveAttributeGroup(AttributeGroupRequest request) {

        // 入参检查
        checkAttributeGroupRequest(request);

        Long groupId = attributeRepository.saveAttributeGroup(request);

        return new AttributeGroupResultDTO(groupId, true);
    }

    private void checkAttributeGroupRequest(AttributeGroupRequest request) {
        ParamCheckUtil.checkObjectNonNull(request);
        if (request.getCategoryId() == null || StringUtils.isBlank(request.getGroupName())) {
            throw new BaseBizException(CommonErrorCodeEnum.SERVER_ILLEGAL_ARGUMENT_ERROR);
        }
    }

    /**
     * 添加属性模板接口
     */
    @Override
    public AttributeTemplateResultDTO saveAttributeTemplate(AttributeTemplateRequest request) {

        // 入参检查
        checkAttributeTemplateRequest(request);

        Long templteId = attributeRepository.saveAttributeTemplate(request);

        return new AttributeTemplateResultDTO(templteId, true);
    }

    private void checkAttributeTemplateRequest(AttributeTemplateRequest request) {
        ParamCheckUtil.checkObjectNonNull(request);
        if (request.getCategoryId() == null || StringUtils.isBlank(request.getTemplateName())) {
            throw new BaseBizException(CommonErrorCodeEnum.SERVER_ILLEGAL_ARGUMENT_ERROR);
        }
    }

    /**
     * 添加属性模板内容接口
     */
    @Override
    public AttributeTemplateContentResultDTO saveAttributeTemplateContents(List<AttributeTemplateContentRequest> list) {
        // 入参检查
        checkAttributeTemplateContentRequest(list);
        attributeRepository.saveAttributeTemplateContents(list);
        return new AttributeTemplateContentResultDTO(true);
    }

    private void checkAttributeTemplateContentRequest(List<AttributeTemplateContentRequest> list) {
        if (list == null || list.isEmpty()) {
            throw new BaseBizException(CommonErrorCodeEnum.SERVER_ILLEGAL_ARGUMENT_ERROR);
        }
        for (AttributeTemplateContentRequest e : list) {
            if (e.getTemplateId() == null || e.getAttributeId() == null || e.getParticipantType() == null
                    || e.getSort() == null) {
                throw new BaseBizException(CommonErrorCodeEnum.SERVER_ILLEGAL_ARGUMENT_ERROR);
            }
        }
    }

    /**
     * 分页查询属性
     */
    @Override
    public PageResult<AttributeInfoDTO> pageAttributeInfo(QueryAttributeInfoRequest request) {
        return attributeRepository.pageAttributeInfo(request);
    }

    /**
     * 根据属性id查询属性及可选的属性值
     */
    @Override
    public List<AttributeValueDTO> queryAttributeValueByAttributeId(Long attributeId) {
        if (attributeId == null || attributeId < 0) {
            return null;
        }
        return attributeRepository.queryAttributeValueByAttributeId(attributeId);
    }

    /**
     * 分页查询属性组
     */
    @Override
    public PageResult<AttributeGroupDTO> pageAttributeGroup(QueryAttributeGroupRequest request) {
        return attributeRepository.pageAttributeGroup(request);
    }

    /**
     * 分页查询属性模板
     */
    @Override
    public PageResult<AttributeTemplateDTO> pageAttributeTemplate(QueryAttributeTemplateRequest request) {
        return attributeRepository.pageAttributeTemplate(request);
    }

    /**
     * 根据属性模板id查询属性模板的内容
     */
    @Override
    public List<AttributeTemplateContentDTO> queryAttributeTemplateContentByTemplateId(Long templateId) {
        if (templateId == null || templateId < 0) {
            return null;
        }
        return attributeRepository.queryAttributeTemplateContentByTemplateId(templateId);
    }
}
